package com.itheima.health.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.itheima.health.dao.RoleDao;
import com.itheima.health.entity.PageResult;
import com.itheima.health.entity.QueryPageBean;
import com.itheima.health.Exception.MyException;
import com.itheima.health.pojo.Menu;
import com.itheima.health.pojo.Permission;
import com.itheima.health.pojo.Role;
import com.itheima.health.service.RoleService;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import java.util.List;
import java.util.Map;

/**
 * <p>
 *     角色管理
 * </p>
 * @Author：Super
 * @Date: 2020/12/4 15:13
 */
@Service(interfaceClass = RoleService.class)
public class RoleServiceImpl implements RoleService {


    @Autowired
    private RoleDao roleDao;


    /**
     * 角色管理的分页条件查询
     * @param queryPageBean
     * @return
     */
    @Override
    public PageResult<Role> findPage(QueryPageBean queryPageBean) {
        //使用插件进行分页展示
        PageHelper.startPage(queryPageBean.getCurrentPage(),queryPageBean.getPageSize());

        //判断查询条件是否为null
        if (!StringUtils.isEmpty(queryPageBean.getQueryString())) {
            //赋值添加%方便模糊查询
            queryPageBean.setQueryString("%"+queryPageBean.getQueryString()+"%");
        }

        //调用dao方法查询返回结果是Page<>
        Page<Role> rolePage = roleDao.findByCondition(queryPageBean.getQueryString());

        return new PageResult<Role>(rolePage.getTotal(),rolePage.getResult());

    }


    /**
     * 查询所有权限
     * @return
     */
    @Override
    public List<Permission> findAllPermission() {

        return roleDao.findAllPermission();
    }

    /**
     * 查询所有菜单
     * @return
     */
    @Override
    public List<Menu> findAllMenu() {
        return roleDao.findAllMenu();
    }


    /**
     * 添加角色
     * @param param
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void add(Map<String, Object> param) {

        //从参数中获取数据，进行封装添加
        //获取角色信息
        Map<String, String> formData = (Map<String, String>) param.get("formData");

        Role role = new Role();

        role.setName(formData.get("name"));
        role.setKeyword(formData.get("keyword"));
        role.setDescription(formData.get("description"));


        //添加进数据库，获取自增长id
        roleDao.addRole(role);

        Integer roleId = role.getId();

        //获取角色的权限集合，非空判断后进行添加
        List<Integer> permissionIds = (List<Integer>) param.get("permissionIds");

        if (permissionIds != null) {
            permissionIds.forEach(permissionId ->{
                roleDao.addRolePermission(roleId,permissionId);
            });
        }

        //获取菜单信息集合，非空判断后进行添加
        List<Integer> menuIds = (List<Integer>) param.get("menuIds");

        if (menuIds != null) {
            menuIds.forEach(menuId ->{
                roleDao.addRoleMenu(roleId,menuId);
            });
        }
    }


    /**
     * 删除角色
     * @param id
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void deleteById(Integer id) {

        //删除角色分两步：1.检查角色业务中关联的表是否有存在使用；2.删除外键联系再删除本体信息
        //查询是否被用户表使用该角色
        int count = roleDao.findCountByRoleId(id);

        if (count > 0) {
            //存在被使用的关系,不能直接删除
            throw  new MyException("该角色已被用户使用"+count+"次，请先在用户管理的编辑中解除关系再进行删除操作。");
        }

        //可以删除角色，先删除权限的联系
        roleDao.deleteRolePermissionById(id);
        //删除菜单的联系
        roleDao.deleteRoleMenuById(id);
        //删除角色
        roleDao.deleteRoleById(id);

    }


    /**
     * 修改角色数据回显--查询角色
     * @param id
     * @return
     */
    @Override
    public Role findRoleById(Integer id) {
        return roleDao.findRoleById(id);
    }


    /**
     * 查询和角色对应的权限
     * @param id
     * @return
     */
    @Override
    public List<Integer> findPermissionIdsByRoleId(Integer id) {
        return roleDao.findPermissionIdsByRoleId(id);
    }

    /**
     * 查询和角色对应的菜单
     * @param id
     * @return
     */
    @Override
    public List<Integer> findMenuIdsByRoleId(Integer id) {
        return roleDao.findMenuIdsByRoleId(id);
    }


    /**
     * 编辑角色
     * @param param
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void update(Map<String, Object> param) {

        //获取角色数据
        Map<String, Object> roleMap = (Map<String, Object>) param.get("formData");

        Role role = new Role();

        Integer id = (Integer) roleMap.get("id");

        System.out.println(id);

        role.setId(id);

//        role.setId(Integer.parseInt(roleMap.get("id")));
        role.setName((String) roleMap.get("name"));
        role.setDescription((String) roleMap.get("description"));
        role.setKeyword((String) roleMap.get("keyword"));

        //修改角色
        roleDao.update(role);

        //删除关联的权限，菜单数据
        roleDao.deleteRolePermissionById(role.getId());
        roleDao.deleteRoleMenuById(role.getId());

        //非空判断然后再添加
        List<Integer> permissionIds = (List<Integer>) param.get("permissionIds");
        if (permissionIds != null) {
            permissionIds.forEach(permissionId ->{
                roleDao.addRolePermission(role.getId(),permissionId);
            });
        }

        List<Integer> menuIds = (List<Integer>) param.get("menuIds");
        if (menuIds != null) {
            menuIds.forEach(menuId ->{
                roleDao.addRoleMenu(role.getId(),menuId);
            });
        }
    }

    @Override
    public List<Role> findAll() {
        return roleDao.findAll();
    }


}
